#include<stdio.h>
#include<stdlib.h>

/*c语言操作学习第2课：malloc使用细节*/

void method(int *p,int size)//函数功能：遍历
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ",p[i]);
    }
    printf("\n");
}

int main()
{
    int *p = malloc(100);//属于强行把void类型的指针转换成了int类型的指针
    int P_size = 25;//总共可以存储25个int

    method(p,P_size);
    free(p);
    int number = 1024 * 1024 * 1024;//1GB的空间
    int count = 0;
    while (1)
    {
        int *P = malloc(number);
        count++;
        if (P == NULL)//申请失败，P返回值为NULL
        {
            printf("申请失败\n");
            break;
        }
        printf("第%d次申请成功%p\n",count,P);
    }
/*
    linux：
    采用"先用后审"策略，malloc会立刻成功，实际用内存时才分配物理资源
    可分配远超实际内存大小的虚拟内存，因此能成功非常多次

    Windows系统：
    采用"先审后用"策略，malloc时会检查实际可用资源
    分配次数受物理内存和硬盘交换空间限制，通常只能成功几十次

    注意事项：
    不要依赖malloc的初始值(可能为0但不是保证)
    总是检查malloc返回值是否为NULL
    需要初始化内存时使用calloc或手动初始化
    不同系统有不同内存管理策略，编写跨平台程序时要注意
*/
    return 0;
}